package com.c2b.algorithm.leetcode.base;

/**
 * <a href="https://leetcode.cn/problems/the-employee-that-worked-on-the-longest-task/">处理用时最长的那个任务的员工</a>
 * <p>
 * 共有 n 位员工，每位员工都有一个从 0 到 n - 1 的唯一 id 。
 * 给你一个二维整数数组 logs ，其中 logs[i] = [idi, leaveTimei] ：
 * <li>idi 是处理第 i 个任务的员工的 id ，且</li>
 * <li>leaveTimei 是员工完成第 i 个任务的时刻。所有 leaveTimei 的值都是 唯一 的。</li>
 * 注意，第 i 个任务在第 (i - 1) 个任务结束后立即开始，且第 0个任务从时刻 0开始。
 * 返回处理用时最长的那个任务的员工的 id 。如果存在两个或多个员工同时满足，则返回几人中 最小 的 id 。
 * </p>
 *
 * <pre>
 * 示例 1：
 *      输入：n = 10, logs = [[0,3],[2,5],[0,9],[1,15]]
 *      输出：1
 *      解释：
 *          任务 0 于时刻 0 开始，且在时刻 3 结束，共计 3 个单位时间。
 *          任务 1 于时刻 3 开始，且在时刻 5 结束，共计 2 个单位时间。
 *          任务 2 于时刻 5 开始，且在时刻 9 结束，共计 4 个单位时间。
 *          任务 3 于时刻 9 开始，且在时刻 15 结束，共计 6 个单位时间。
 *          时间最长的任务是任务 3 ，而 id 为 1 的员工是处理此任务的员工，所以返回 1 。
 *
 * 示例 2：
 *      输入：n = 26, logs = [[1,1],[3,7],[2,12],[7,17]]
 *      输出：3
 *      解释：
 *          任务 0 于时刻 0 开始，且在时刻 1 结束，共计 1 个单位时间。
 *          任务 1 于时刻 1 开始，且在时刻 7 结束，共计 6 个单位时间。
 *          任务 2 于时刻 7 开始，且在时刻 12 结束，共计 5 个单位时间。
 *          任务 3 于时刻 12 开始，且在时刻 17 结束，共计 5 个单位时间。
 *          时间最长的任务是任务 1 ，而 id 为 3 的员工是处理此任务的员工，所以返回 3 。
 *
 * 示例 3：
 *      输入：n = 2, logs = [[0,10],[1,20]]
 *      输出：0
 *      解释：
 *          任务 0 于时刻 0 开始，且在时刻 10 结束，共计 10 个单位时间。
 *          任务 1 于时刻 10 开始，且在时刻 20 结束，共计 10 个单位时间。
 *          时间最长的任务是任务 0 和 1 ，处理这两个任务的员工的 id 分别是 0 和 1 ，所以返回最小的 0 。
 * </pre>
 * <b>提示：</b>
 * <li>2 <= n <= 500</li>
 * <li>1 <= logs.length <= 500</li>
 * <li>logs[i].length == 2</li>
 * <li>0 <= idi <= n - 1</li>
 * <li>1 <= leaveTimei <= 500</li>
 * <li>idi != idi + 1</li>
 * <li>leaveTimei 按严格递增顺序排列</li>
 *
 * @author c2b
 * @since 2023/4/14 10:11
 */
public class LC2432HardestWorker_S {

    public int hardestWorker(int n, int[][] logs) {
        // 假设第一个员工耗时最长
        int id = logs[0][0];
        int takeMaxTimes = logs[0][1];
        for (int i = 1; i < logs.length; i++) {
            int tempTakeTime = logs[i][1] - logs[i - 1][1];
            if (tempTakeTime > takeMaxTimes) {
                // 本次耗费时间值大于最大耗费时间值，则更新id和最大耗费时间
                takeMaxTimes = tempTakeTime;
                id = logs[i][0];
            } else if (tempTakeTime == takeMaxTimes) {
                // 本次耗费时间值等于最大耗费时间值，尝试更新id的最小值.
                id = Math.min(id, logs[i][0]);
            }
        }
        return id;
    }

    public static void main(String[] args) {
        LC2432HardestWorker_S lc2432HardestWorker_s = new LC2432HardestWorker_S();
        System.out.println(lc2432HardestWorker_s.hardestWorker(10, new int[][]{{36, 3}, {1, 5}}));
    }
}
